calc: Allow subterms with '(' ')' bracketing
authorBenjamin Otte <otte@redhat.com>
Sat, 13 Feb 2016 03:12:45 +0000 (04:12 +0100)
committerBenjamin Otte <otte@redhat.com>
Sat, 13 Feb 2016 03:49:08 +0000 (04:49 +0100)
Some more tests included.

gtk/gtkcsscalcvalue.c
testsuite/css/parser/calc-errors.css
testsuite/css/parser/calc-errors.errors
testsuite/css/parser/calc.css
testsuite/css/parser/calc.ref.css

index 2bcb5455fc5699509168af35b8f11210cb538069..e10e790b23a91600c1264dd3f2d023c137387589 100644 (file)
@@ -316,6 +316,9 @@ gtk_css_calc_value_new_sum (GtkCssValue *value1,
   return gtk_css_value_new_from_array (array);
 }
 
+GtkCssValue *   gtk_css_calc_value_parse_sum (GtkCssParser           *parser,
+                                              GtkCssNumberParseFlags  flags);
+
 GtkCssValue *
 gtk_css_calc_value_parse_value (GtkCssParser           *parser,
                                 GtkCssNumberParseFlags  flags)
@@ -326,6 +329,22 @@ gtk_css_calc_value_parse_value (GtkCssParser           *parser,
       return NULL;
     }
 
+  if (_gtk_css_parser_try (parser, "(", TRUE))
+    {
+      GtkCssValue *result = gtk_css_calc_value_parse_sum (parser, flags);
+      if (result == NULL)
+        return NULL;
+
+      if (!_gtk_css_parser_try (parser, ")", TRUE))
+        {
+          _gtk_css_parser_error (parser, "Missing closing ')' in calc() subterm");
+          _gtk_css_value_unref (result);
+          return NULL;
+        }
+
+      return result;
+    }
+
   return _gtk_css_number_value_parse (parser, flags);
 }
 
index a109e624001ab9794769252c87db41561cc82bfe..b1464c30cbc7bb0eced18ab0f584408c3e22c601 100644 (file)
@@ -57,3 +57,19 @@ n {
 o {
   margin-left: calc(1px / error);
 }
+
+p {
+  margin-left: calc((((((1px))));
+}
+
+q {
+  margin-left: calc((((((1px)))))))));
+}
+
+r {
+  margin-left: calc(1px + (1));
+}
+
+s {
+  margin-left: calc(1px + (error));
+}
index 891991dd35afdc7f1af0eb4ad4283759b445f767..cb8139b2a784405e6650cfbe98047b193455e841 100644 (file)
@@ -13,3 +13,7 @@ calc-errors.css:46: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
 calc-errors.css:50: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
 calc-errors.css:54: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
 calc-errors.css:58: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
+calc-errors.css:62: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
+calc-errors.css:66: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
+calc-errors.css:70: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
+calc-errors.css:74: error: GTK_CSS_PROVIDER_ERROR_SYNTAX
index 5406818e472c0c613311da0a8d6b8ba812e62ef8..cc511fa7de82e28452e3538621d77d6fcc54bec5 100644 (file)
@@ -21,3 +21,19 @@ e {
 f {
   background-size: calc(2 * 3px + 4px * 5 - 6px / 3);
 }
+
+g {
+  background-size: calc((((((1px))))));
+}
+
+h {
+  background-size: calc(3 * ((4px + ((4 * (6px + 3em)) / 3)) + 5em));
+}
+
+i {
+  border-top-left-radius: calc(1px * (3 + 2)) calc(1px / ( 3 / (2 * 1.5)));
+}
+
+j {
+  border-bottom-right-radius: calc((1 + 1 + (1 + 1) + 1) * 1px) calc((1 / 1) * 1px);
+}
index f0c2bbec070aedfeab87aeca55fe7ff63d28bc68..cc2ca59d82455b5cb3a4f94b0ba74b8809c5d73b 100644 (file)
@@ -21,3 +21,19 @@ e {
 f {
   background-size: 24px;
 }
+
+g {
+  background-size: 1px;
+}
+
+h {
+  background-size: calc(27em + 36px);
+}
+
+i {
+  border-top-left-radius: 5px 1px;
+}
+
+j {
+  border-bottom-right-radius: 5px 1px;
+}